﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;


namespace XtremBiking.Logica.Repositorio
{
    internal static class UsuarioManagement
    {

        #region LogIn
        /// <summary>
        /// Method responsible to control a backoffce user login.
        /// </summary>
        /// <param name="loginName">User login name</param>
        /// <param name="password">User password</param>
        internal static XtremBiking.Logica.DTO.Usuario LogIn(string mail, string password)
        {
            XtremBiking.Logica.DTO.Usuario userDTO = null;
            XtremBiking.Entidades.Usuario user = null;
            using (XtremBiking.Entidades.XBEntities ctx = new Entidades.XBEntities())
            {
                try
                {
                    //TODO: mejorar consulta.....
                    user = ctx.Usuario.SingleOrDefault(p => p.Mail == mail && p.Clave == password);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

            if (user != null)
            {
                userDTO = new DTO.Usuario()
                {
                    Apellidos = user.Apellidos,
                    Clave = user.Clave,
                    Estado = (Enumerados.Usuarios.Estado) user.IdEstado,
                    FechaRegistro = user.FechaRegistro,
                    FechaUltimoLogin = user.FechaUltLogin,
                    IdUsuario = user.IdUsuario,
                    Mail = user.Mail,
                    Nivel = (Enumerados.Usuarios.Nivel) user.IdNivelUsuario,
                    Nombre = user.Nombre,
                    Perfil = (Enumerados.Usuarios.Perfil) user.IdPerfil,
                    primerLogin = user.PrimerLogin
                    //IdUser = user.IdBackOfficeUser,
                    //DisplayName = user.DisplayName,
                    //Email = user.Email,
                    //FirstLogin = user.FirstLogin,
                    //IdCompany = user.IdCompany,
                    //LoginsAttempts = (int)user.LoginsAttempts,
                    //Password = user.Password,
                    //Status = (Phoenix.Domain.Enumerations.UserStatus)user.IdStatus,
                    //profileId = Phoenix.Domain.Repository.ProfileManagement.GetProfileByUserId(user.IdBackOfficeUser).IdProfile,
                    //LastLogin = UserManagement.LastLogin(user.IdBackOfficeUser).ToLocalTime()
                };
            }

            return userDTO;
        }
        #endregion


       //TODO: HACER METODO PARA ACTUALIZAR FECHA DE ULTIMO LOGIN
       //TODO: HACER METODO PARA ACTUALIZAR LA BANDERA PRIMER LOGIN UNA VEZ QUE SE ACTUALIZA EL PASSWORD
       //TODO: HACER METODO PARA ACTUALIZAR PASSWORD DE USUARIO

        internal static bool EmailAvailable(string email, string currentEmail)
        {
            bool ret = false;
            try
            {
                using (Entidades.XBEntities ctx = new Entidades.XBEntities())
                {
                    //ret = ctx.Atletas.Count(email, currentEmail, ctx);
                    if (currentEmail == null)
                    {

                        ret = ctx.Usuario.Count(p => p.Mail == email) == 0;
                    }
                    else
                    {
                        ret = ctx.Usuario.Count(p => p.Mail == email && p.Mail != currentEmail) == 0;
                    }
                }
            }
            catch (Exception ex) 
            {
            
            }
            return ret;
        }

        internal static bool CrearUsuario(DTO.Usuario modelo)
        {
            bool retorno = false;
            try
            {

                XtremBiking.Entidades.Usuario usuario = new Entidades.Usuario()
                {
                    Apellidos = modelo.Apellidos,
                    Clave = Extensions.Encrypt(modelo.Clave),
                    FechaRegistro = modelo.FechaRegistro,
                    FechaUltLogin = modelo.FechaUltimoLogin,
                    IdEstado = (int)modelo.Estado,
                    IdNivelUsuario = (int) modelo.Nivel,
                    IdPerfil = (int) modelo.Perfil,
                    Mail = modelo.Mail,
                    Nombre = modelo.Nombre,
                    PrimerLogin = modelo.primerLogin
                };

                using (Entidades.XBEntities ctx = new Entidades.XBEntities())
                {
                    ctx.Usuario.Add(usuario);
                    ctx.SaveChanges();
                    retorno = true;
                    //Generar mail para el usuario
                    Emails.EmailRegistroUsuario(modelo.Nombre, modelo.Clave, modelo.Mail);
                }

            }
            catch (Exception ex)
            {
                retorno = false;
                throw new Exception(ex.Message);
            }
            return retorno;
        }

        #region SelectById
        /// <summary>
        /// Method responsible for selecting an object of type DAL.BackOfficeUser by their id, and return the same.
        /// </summary>
        /// <param name="id">BackOfficeUser Identifier</param>
        /// <returns>DTO.User object</returns>
        internal static DTO.Usuario SelectById(long id)
        {
            Entidades.Usuario user;
            DTO.Usuario userDto = null;

            using (Entidades.XBEntities ctx = new Entidades.XBEntities())
            {
                user = ctx.Usuario.SingleOrDefault(x => x.IdUsuario==id);
                //SingleOrDefault(x => x.IdBackOfficeUser == id);

            }
            if (user != null)
            {
                //Phoenix.Domain.DTO.BackOffice.Profile profile = ProfileManagement.GetProfileByUserId(user.IdBackOfficeUser);
                userDto = new DTO.Usuario()
                {
                    Apellidos = user.Apellidos,
                    Clave = user.Clave,
                    Estado = (Enumerados.Usuarios.Estado)user.IdEstado,
                    FechaRegistro = user.FechaRegistro,
                    FechaUltimoLogin = user.FechaUltLogin,
                    IdUsuario = user.IdUsuario,
                    Mail = user.Mail,
                    Nivel = (Enumerados.Usuarios.Nivel)user.IdNivelUsuario,
                    Nombre = user.Nombre,
                    Perfil = (Enumerados.Usuarios.Perfil)user.IdPerfil,
                    primerLogin = user.PrimerLogin
                };

                //if (profile != null)
                //{
                //    userDto.profileId = profile.IdProfile;
                //    userDto.profileName = profile.Name;
                //}

            }
            return userDto;
        }
        #endregion


        internal static void UpdateUserPassword(DTO.Usuario userDTO)
        {



            Entidades.Usuario user = null;

            List<string> modifiedProperties = new List<string>() { "Clave", "PrimerLogin" };

            using (Entidades.XBEntities ctx = new Entidades.XBEntities())
            {
                user = ctx.Usuario.FirstOrDefault(x => x.IdUsuario == userDTO.IdUsuario);
                user.Clave = userDTO.Clave;
                user.PrimerLogin = false;
                ctx.Usuario.Attach(user);
                var entry = ctx.Entry(user).State = System.Data.Entity.EntityState.Modified;
                ctx.SaveChanges();
            }
        }

        internal static List<DTO.Usuario> SelectAllUsers()
        {
            List<XtremBiking.Entidades.Usuario> usuarios = null;
            List<XtremBiking.Logica.DTO.Usuario> usuariosDTO = null;
            XtremBiking.Logica.DTO.Usuario usuario = null;
            //using (Phoenix.Entities.PhoenixEntities ctx = new Phoenix.Entities.PhoenixEntities())
            //{
            using (Entidades.XBEntities ctx = new Entidades.XBEntities())
            {
                usuarios = (from c in ctx.Usuario
                         select c).ToList();
            }

            if (usuarios != null) 
            {
                usuariosDTO = new List<DTO.Usuario>();
                foreach (Entidades.Usuario item in usuarios)
                {
                    usuario = new DTO.Usuario()
                    {
                        Apellidos = item.Apellidos,
                        Clave = item.Clave,
                        Estado = (Enumerados.Usuarios.Estado)item.IdEstado,
                        FechaRegistro = item.FechaRegistro,
                        FechaUltimoLogin = item.FechaUltLogin,
                        IdUsuario = item.IdUsuario,
                        Mail = item.Mail,
                        Nivel = (Enumerados.Usuarios.Nivel)item.IdNivelUsuario,
                        Nombre = item.Nombre,
                        Perfil = (Enumerados.Usuarios.Perfil)item.IdPerfil,
                        primerLogin = item.PrimerLogin
                    };
                    usuariosDTO.Add(usuario);
                }
            
            }
            return usuariosDTO;
        }

        internal static bool SavePersonalInfo(DTO.PersonalInfo fichaDTO)
        {
            bool retorno = false;
            Entidades.FichaUsuario ficha = null;
            //Entidades.Usuario usuarioDB = null;

            using (Entidades.XBEntities ctx = new Entidades.XBEntities())
            {


                //usuarioDB = ctx.Usuario.FirstOrDefault(o => o.IdUsuario == fichaDTO.IdUsuario);

                //if (usuarioDB != null) 
                //{
                //    if (usuarioDB.FichaUsuario == null) 
                //    {
                //        ficha = new Entidades.FichaUsuario()
                //        {
                //            IdUsuario = fichaDTO.IdUsuario,
                //            Altura = fichaDTO.Altura,
                //            //Antiguedad=fichaDTO.
                //            Celular = fichaDTO.Celular,
                //            CompetenciasConcurridas = fichaDTO.Competencias,
                //            Direccion = fichaDTO.Direccion,
                //            Documento = fichaDTO.Documento,
                //            FechaNacimiento = fichaDTO.FechaNacimiento,
                //            KmRecorridos = fichaDTO.KmsRecorridos,
                //            // Metas = fichaDTO
                //            Peso = fichaDTO.Peso,
                //            PorQueCiclismo = fichaDTO.PorQueCiclismo,
                //            PulsoBasal = fichaDTO.PulsoBasal,
                //            PulsoMaximo = fichaDTO.PulsoMaximo,
                //            Telefono = fichaDTO.Telefono
                //            //TiempoDisponibleEntrenamiento = fichaDTO
                //        };
                //        usuarioDB.FichaUsuario.Add(ficha);
                //        ctx.SaveChanges();
                //        retorno = true;
                //        return retorno;
                //    }

                //    //usuarioDB.FichaUsuario.Add(ficha);// = new Entidades.FichaUsuario() { };
                //}


                if (ctx.FichaUsuario.Any(o => o.IdUsuario == fichaDTO.IdUsuario))
                {
                    ficha = ctx.FichaUsuario.FirstOrDefault(x => x.IdUsuario == fichaDTO.IdUsuario);
                    
                    ficha.Altura = fichaDTO.Altura;
                    //ficha.Antiguedad=fichaDTO.
                    ficha.Celular = fichaDTO.Celular;
                    ficha.CompetenciasConcurridas = fichaDTO.Competencias;
                    ficha.Direccion = fichaDTO.Direccion;
                    ficha.Documento = fichaDTO.Documento;
                    ficha.FechaNacimiento = fichaDTO.FechaNacimiento;
                    ficha.KmRecorridos = fichaDTO.KmsRecorridos;
                    // ficha.Metas = fichaDTO
                    ficha.Peso = fichaDTO.Peso;
                    ficha.PorQueCiclismo = fichaDTO.PorQueCiclismo;
                    ficha.PulsoBasal = fichaDTO.PulsoBasal;
                    ficha.PulsoMaximo = fichaDTO.PulsoMaximo;
                    ficha.Telefono = fichaDTO.Telefono;
                    //ficha.TiempoDisponibleEntrenamiento = fichaDTO

                    
                    //user.Clave = userDTO.Clave;
                    //user.PrimerLogin = false;
                    ctx.FichaUsuario.Attach(ficha);
                    var entry = ctx.Entry(ficha).State = System.Data.Entity.EntityState.Modified;
                //ficha = ctx.FichaUsuario.FirstOrDefault(x => x.IdUsuario == userDTO.IdUsuario);
                //if (ficha != null)
                //{
                    


                }
                else 
                {
                    ficha = new Entidades.FichaUsuario() {
                        IdUsuario = fichaDTO.IdUsuario,
                        Altura = fichaDTO.Altura,
                        //Antiguedad=fichaDTO.
                        Celular = fichaDTO.Celular,
                        CompetenciasConcurridas = fichaDTO.Competencias,
                        Direccion = fichaDTO.Direccion,
                        Documento = fichaDTO.Documento,
                        FechaNacimiento = fichaDTO.FechaNacimiento,
                        KmRecorridos = fichaDTO.KmsRecorridos,
                        // Metas = fichaDTO
                        Peso = fichaDTO.Peso,
                        PorQueCiclismo = fichaDTO.PorQueCiclismo,
                        PulsoBasal = fichaDTO.PulsoBasal,
                        PulsoMaximo = fichaDTO.PulsoMaximo,
                        Telefono = fichaDTO.Telefono
                        //TiempoDisponibleEntrenamiento = fichaDTO
                    };
                   
                    ctx.FichaUsuario.Add(ficha);
                    //ctx.SaveChanges();
                    //retorno = true;
                }
                   
                   ctx.SaveChanges();
                   retorno = true;
                   return retorno;
            }
        }

        internal static DTO.PersonalInfo GetPersonalInfo(long idUser) 
        {
            Entidades.FichaUsuario ficha = null;
            DTO.PersonalInfo fichaDTO = null;
            using (Entidades.XBEntities ctx = new Entidades.XBEntities())
            {
                ficha = ctx.FichaUsuario.FirstOrDefault(x=>x.IdUsuario==idUser);

                if (ficha != null) 
                {
                    fichaDTO = new DTO.PersonalInfo()
                    {
                        Altura = (float)ficha.Altura,
                        Celular = ficha.Celular,
                        Competencias = ficha.CompetenciasConcurridas,
                        Direccion = ficha.Direccion,
                        Documento = ficha.Documento,
                        FechaNacimiento = ficha.FechaNacimiento,
                        IdUsuario = ficha.IdUsuario,
                        KmsRecorridos = (int)(ficha.KmRecorridos != null ? ficha.KmRecorridos : 0),
                        Peso = (float)ficha.Peso,
                        PorQueCiclismo = ficha.PorQueCiclismo,
                        PulsoBasal = (int)(ficha.PulsoBasal != null ? ficha.PulsoBasal : 0),
                        PulsoMaximo = (int)(ficha.PulsoMaximo != null ? ficha.PulsoMaximo : 0),
                        Telefono = ficha.Telefono
                    };
                }
            }
            return fichaDTO;
        }

        internal static bool SaveUserGoal(DTO.UserGoal modeloDTO)
        {
            Entidades.Objetivo goal = null;
            bool retorno = true;

            try
            {
                if (modeloDTO != null)
                {
                    using (Entidades.XBEntities ctx = new Entidades.XBEntities())
                    {
                        goal = new Entidades.Objetivo()
                        {
                            Descripcion = modeloDTO.Description,
                            Fecha = modeloDTO.Date,
                            FechaRegistro = DateTime.Now,
                            IdUsuario = modeloDTO.IdUser,
                            Usuario = ctx.Usuario.FirstOrDefault(x=> x.IdUsuario == modeloDTO.IdUser)
                        };

                        //ctx.Objetivo.Add(goal);
                        //ctx.SaveChanges();
                        Emails.EmailNewUserGoal(goal.Usuario.Nombre + " " + goal.Usuario.Apellidos, goal.Descripcion, goal.Fecha, goal.FechaRegistro);

                    }
                }

            }
            catch (Exception ex) 
            {
                retorno = false;
            }
            return retorno;
        }

        internal static List<DTO.UserGoal> GetUserGoals(long idUser)
        {
            List<Entidades.Objetivo> goals = null;
            DTO.UserGoal goalDTO = null;
            List<DTO.UserGoal> goalListDTO = null;
            
            using (Entidades.XBEntities ctx = new Entidades.XBEntities())
            {
                goals = ctx.Objetivo.Where(x => x.IdUsuario == idUser && x.Fecha > DateTime.Today).ToList();

                if (goals != null && goals.Count>0)
                {
                    goalListDTO = new List<DTO.UserGoal>();
                    foreach (Entidades.Objetivo item in goals)
                    {
                        goalDTO = new DTO.UserGoal() 
                        {
                            Date = item.Fecha,
                            Description = item.Descripcion,
                            IdUser = item.IdUsuario,
                            IdUserGoal = item.IdObjetivo
                        };
                        goalListDTO.Add(goalDTO);        
                    }
                    
                }
            }
            return goalListDTO;
        }

    }
}
